package com.gvfish.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;



public abstract  class CommonJPADao <T,K extends Serializable>{
	
	private String queryStr ="SELECT t FROM "+ getTClass().getSimpleName()+" t where ";

	public boolean save(T t){
		getTheEntityManager().persist(t);
		return true;
	}
	
	public T update(T t){
		return getTheEntityManager().merge(t);
	}
	
	/**
	 * 移除实体
	 * @param t
	 */
	public void del(T t){
		getTheEntityManager().remove(t);
	}
	
	/**
	 * 移除实体
	 * @param t
	 */
	public void del(K k){
		getTheEntityManager().remove(find(k));
	}
	
	/*
	 * 根据id查找实体
	 */
	public T find(K k){
		return (T)getTheEntityManager().find(getTClass(), k);
	}
	
	
	
	@SuppressWarnings("unchecked")
	public List<T> findAll(){
		
//		String str = "SELECT t FROM "+getTClass().getSimpleName()+" t order by t.id desc";
		String str = "SELECT t FROM "+getTClass().getSimpleName()+" t";
		System.out.println(str);
		
		Query query = getTheEntityManager().createQuery(str);
		
		
		List<T> result2 =new ArrayList(query.getResultList());
		return result2;
	}
	/**
	 * 根据类、字段名及字段值加载对象，只加载一条符合条件的对象。
	 * 
	 * @param clz
	 * @param fieldName
	 * @param value
	 * @return 若查询到指定属性及值的持久对象，则返回该对象，否则返回null
	 */
	@SuppressWarnings("unchecked")
	public T getBy(String fieldName, Serializable value){
		String qStr = queryStr+fieldName +" = ?1";
		Query query = getTheEntityManager().createQuery(qStr);
		query.setParameter(1, value);
		return (T)query.getSingleResult();
	}

	/**
	 * 根据条件查询对象
	 * 
	 * @param clz 类名
	 * @param scope 查询条件
	 * @return 返回查询的记录结果记录
	 */
	List<T> query(String scope){
		return query(scope, null);
	}

	/**
	 * 根据条件、条件参数查询对象
	 * 
	 * @param clz 类名
	 * @param scope 查询条件
	 * @param paras 查询参数
	 * @return 返回查询的记录结果集
	 */
	List<T> query(String scope, Collection paras){
		return query(scope, paras, -1, -1);
	}

	/**
	 * 查询符合条件的对象，从begin开始取max条记录
	 * 
	 * @param clz Java类
	 * @param scope 查询条件
	 * @param paras 查询参数
	 * @param begin 返回有效结果开始记录数
	 * @param max  返回的最多记录数
	 * @return 返回查询的记录结果集
	 */
	List<T> query(String scope, Collection paras, int begin, int max){
		Query query = getTheEntityManager().createQuery(
				" select t from " + getTClass() + " t where " + scope);
		int parameterIndex = 0;
		if (paras != null && paras.size() > 0) {
			for (Object obj : paras) {
				query.setParameter(parameterIndex++, obj);
			}
		}
		if (begin >= 0 && max > 0) {
			query.setFirstResult(begin);
			query.setMaxResults(max);
		}
		return query.getResultList();
	}
	
//	/**
//	 * 执行sql语句，并返回一个对象,如select count(*) from tableName等
//	 * @param sql sql语句
//	 * @return 返回查询结果，若没有结果则返回null
//	 */
//	Object uniqueResult(String sql);
//	
//	/**
//	 * 根据sql语句及查询参数执行查询，并返回一个唯一对象，如select count(*) from tableName where filed=?
//	 * @param sql
//	 * @param paras
//	 * @return 返回单一的查询结果，若没有结果则返回null
//	 */
//	Object uniqueResult(String sql,Collection paras);
//	
//	/**
//	 * 执行任意sql语句，返回受影响的记录数
//	 * @param sql sql语句
//	 * @return 返回受影响的记录数
//	 */
//	int execute(String sql); 
//	/**
//	 * 根据sql语句及参数执行数据库操作，返回受影响的记录数
//	 * @param sql sql语句
//	 * @param paras 参数
//	 * @return 返回受影响的记录数
//	 */
//	int execute(String sql,Collection paras);
	
	
	
	
	public abstract Class<T> getTClass();
	public abstract EntityManager getTheEntityManager();
}
